package cn.initcap.concurrency.classloader;

/**
 * 方法静态分派演示
 * <p>
 * 我们把下面代码中的"BaseHuman"称为变量的静态类型（Static Type），或者叫做外观类型（Apparent Type），后面的"Man"
 * 则称为变量的时机类型（Actual Type），静态类型和时机类型在程序中都可以发生一些变化，区别是静态类型的变化仅仅在
 * 使用时发生，变量本身的静态类型不会被改变，并且最终的静态类型是在编译期可知的；
 *
 * @author initcap
 * @date Created in 2018/7/26 AM8:31.
 */
public class StaticDispatch {

    public static void main(String[] args) {
        BaseHuman man = new Man();
        BaseHuman woman = new Woman();
        StaticDispatch sr = new StaticDispatch();
        sr.sayHello(man);
        sr.sayHello(woman);
        sr.sayHello((Man) man);
        sr.sayHello((Woman) woman);
    }

    public void sayHello(BaseHuman guy) {
        System.out.println("hello,guy!");
    }

    public void sayHello(Man guy) {
        System.out.println("hello,gentleman!");
    }

    public void sayHello(Woman guy) {
        System.out.println("hello,lady!");
    }

    static abstract class BaseHuman {

    }

    static class Man extends BaseHuman {

    }

    static class Woman extends BaseHuman {

    }

}
